iT邦幫忙

2022 iThome 鐵人賽

DAY 9
1

目錄

  • 前言
  • Syntax
  • 實際寫入資料
  • 寫入多筆資料
  • 查詢資料(SELECT)
  • 寫入特定資料(ENUM)
  • 良率其實算到小數點(NUMERIC)
  • 寶傑:真的假的!(BOOLEAN)
  • 忍術時間暫停之術(TIMESTAMP)
  • 補充:如何儲存檔案?

前言

建立好資料庫跟資料表,下一步我們要做什麼呢?還記得吧!
資料庫設計有三個流程,分別是(1)是什麼(2)要幹嘛(3)怎麼做
其中第二步”要幹嘛"的階段,我們探討出想要儲存地區的資料,
也就是本篇主題,寫入資料。

複習一下 Day 08 建立資料表,我們接下來要把資料寫入這張資料表(Table)當中。

CREATE TABLE districts (
    name VARCHAR(50),
    country VARCHAR(50),
		population INTEGER,
    move_in INTEGER,
    move_out INTEGER,
);

Syntax

  1. 寫入哪個資料表 (告訴它名稱)
  2. 寫入哪個欄位
  3. 寫入的值是什麼
  4. 欄位與值是有順序對應關係的,column1對應value1、column2對應value2…
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);

實際寫入資料

-- 寫入一筆資料
INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('斗六市', '雲林縣', 107598, 384, 335);

寫入多筆資料

-- 寫入三筆資料
INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('斗六市', '雲林縣', 107598, 384, 335);

INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('虎尾鎮', '雲林縣', 70300, 305, 194);

INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('斗南鎮', '雲林縣', 43339, 124, 91);

-- 寫入多筆資料可以使用逗號(,)來進行縮寫
INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('斗六市', '雲林縣', 107598, 384, 335),
('虎尾鎮', '雲林縣', 70300, 305, 194),
('斗南鎮', '雲林縣', 43339, 124, 91);

寫入之後已經可以透過VSCode資料表(table)的放大鏡圖示看到資料了 (show table records)

https://ithelp.ithome.com.tw/upload/images/20220909/20129430hOvqCexpru.png

查詢資料

我們可以透過工具,如VSCode提供的功能來查看資料,但是每個工具方法可能都不一樣,像是要在哪裡按哪個圖示,不熟悉的情況會造成使用上的一點點小困擾,另外一種查看資料的方式就是使用SQL語法,SELECT是SQL當中非常重要的指令,因為在整個使用資料庫的過程中,這個指令要非常頻繁的被使用,我們可以透過以下指令來取得資料:

  1. 選擇要查看哪些欄位,*號則代表全部的欄位都要看
  2. 要查看的這些欄位是屬於哪一個資料表
SELECT * FROM districts;

寫入特定資料(ENUM)

我們要儲存的資料並不想接受任意值,而是只接受固定幾個值,ENUM正式為此而生,
以機台狀態為例,我們有定義好的狀態閒置(IDLE)、運作(RUN)等待(WAIT)、
保養(PM)、驗證(CORR)、異常(DOWN),可以透過定義特殊類別來進行枚舉(ENUM)。

  • ENUM不是標準的SQL標準。
  • PostgreSQL ENUM的設定比起MySQL較為麻煩,需要創建一個自定義類別。
CREATE TYPE tools_status AS ENUM ('IDLE','RUN','WAIT','PM','CORR','DOWN');

CREATE TABLE tools (
	name VARCHAR(200),
	status tools_status 
);

實驗一下,寫入不允許的資料,結果會是如何呢?

INSERT INTO tools (name, status)
VALUES ('M43TS001','PMT');

這個Query語句被系統指出錯誤,輸入的值不被接受,結果如預期。

https://ithelp.ithome.com.tw/upload/images/20220909/20129430LvnFwnizdG.png

現在我們再來寫入被枚舉(ENUM)的值,結果會是如何呢?

INSERT INTO tools (name, status)
VALUES ('M43TS001','PM');

結果如預期,我們學會了透過這個方式來限制資料庫能寫入的資料。

https://ithelp.ithome.com.tw/upload/images/20220909/20129430VhYt9aTETs.png

另外一個議題是資料驗證是否由後端檢查就行了?資料庫有需要搞ENUM嗎?
沒有標準答案,不同組織不同的工作分配及系統規劃,我自己是較少使用這個功能,
不過資料庫的應用並不是只有後端程式、也可能是數據分析的資料匯入,
那就必須靠ENUM去卡控了:)

良率其實算到小數點(NUMERIC)

機台測試良率需要被精準的儲存,因此不選用REAL,
而是使用NUMERIC資料型別來儲存,
寫入資料之後再查詢結果是否如預期?

-- NUMERIC 能夠儲存精準的帶有小數的數字
CREATE TABLE tools_yield (
	name VARCHAR(200),
    -- yield REAL,
	yield NUMERIC(5,2) 
);

INSERT INTO tools_yield (name, yield)
VALUES ('M43TS001', 89.52);

寶傑:真的假的!(BOOLEAN)

欸世聰所以你說那個誰誰誰其實是已經結婚了嗎? 真的假的!
當我們儲存的資料只會有真或假兩個結果的時候,使用BOOLEAN。

CREATE TABLE employees (
	name VARCHAR(200),
	is_marry BOOLEAN
);

INSERT INTO employees (name, is_marry)
VALUES ('孫小美', TRUE),
('小丹尼', FALSE);

忍術時間暫停之術(TIMESTAMP)

時間就是金錢,每個男人心中都希望能有一個時間暫停的忍術,好好的充實自己。
資料庫無法完成這個忍術,但是能夠把時間紀錄下來,使用TIMESTAMP。

CREATE TABLE watch_movies(
	name VARCHAR(200),
	start_at TIMESTAMP,
	end_at TIMESTAMP
);

INSERT INTO watch_movies(name, start_at, end_at)
VALUES ('醍醐味豬腳飯的逆襲紀錄片','2022-09-09 09:09:09', '2022-09-09 09:12:09'),
('誇張好吃的火雞肉飯紀錄片','2022-09-09 09:12:09', '2022-09-09 09:12:12');

TIMESTAMP內建處理時區問題,因此不必設置時區,只需要輸入當地時間,
會由PostgreSQL自動轉換UTC儲存。

補充:如何儲存檔案?

資料庫雖然有儲存檔案的資料類別,但是通常我們並不把檔案儲存在資料庫當中,
而是儲存於某個伺服器的某個資料夾內,然後把檔案的路徑儲存到資料庫當中。

備註 : 檔案儲存的路徑通常由程式設計師所規劃。

CREATE TABLE images (
	image_path VARCHAR(200);
)

// 我們只儲存檔案的路徑
INSERT INTO images(image_path)
VALUES ('uploads/images/user001.jpg');

上一篇
Day 08 建立資料表
下一篇
Day 10 資料表的設定兩三事
系列文
資料庫新手入門--以PostgreSQL為例30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言